import axios from 'axios'
import store from '@/store'

// 加载导航条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

NProgress.configure({ easing: 'ease', speed: 500, showSpinner: true })

const errMessage = {
	401: '未授权',
	404: '资源未找到',
	403: '禁止访问',
	407: 'token过期了',
	500: '服务器错误',
}

const request = axios.create({
	// 请求的公共路径 使用require发送请求会自带baseURL
	baseURL: '/api',
	// 请求超时的毫秒  到时间就中断请求
	timeout: 20000,
})

// 请求拦截器
request.interceptors.request.use(
	// config 请求配置参数：添加公共请求参数的
	(config) => {
		NProgress.start()

		const token = store.state.user.token
		if (token) {
			config.headers.token = token
		}
		// 必须return config
		return config
	}
)

// 响应拦截器
request.interceptors.response.use(
	// 响应成功回调
	(response) => {
		NProgress.done()
		// 过滤成功的data数据
		if (response.data.code === 200) {
			// 必须return 否则打印undefined
			return response.data.data
		} else {
			alert(response.data.message || '未知错误，请联系管理员')
			return Promise.reject()
		}
	},
	// 失败回调
	(error) => {
		NProgress.done()
		// 有response对象 说明服务器返回了参数 ，反之无参数
		if (error.response) {
			alert(errMessage[error.response.status] || '未知错误，请联系管理员')
			if (error.response.status === 407) {
				store.commit('user/RESET')
				window.location.reload()
			}
		} else {
			if (!error.message.indexOf('Network')) {
				alert('无网络,请重新打开网络试试')
			} else if (!error.message.indexOf('timeout')) {
				alert('请求超时，请稍后再试')
			}
		}
		// message: "Request failed with status code 404"  资源不存在
		//          "Network Error"  没网络
		//          "timeout of 1ms exceeded" 请求超时

		// 返回一个失败的Promise，await后面是值就是成功 ,要返回一个失败Promise 才能被catch捕获
		return Promise.reject()
	}
)

export default request
